﻿using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Data;
using System.Data.Entity.Validation;
using System.Diagnostics;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace MIZ.Models
{
    [MetadataType(typeof(MeetinstrumentValidationClass))]
    public partial class Meetinstrument
    {
        #region PROPERTIES
        private static ICollection<Meetinstrument> MeetinstrumentenLijst = null;
        private static int vraagNummer;
        private static int voortgangBalk;
        private static List<string> LichaamsRegioList = new List<string>();
        private static List<int> LichaamsRegioIndex = new List<int>();
        private static List<string> AandoeningenList = new List<string>();
        private static List<int> AandoeningenIndex = new List<int>();
        private static List<string> FunctieList = new List<string>();
        private static List<int> FunctieIndex = new List<int>();
        private static List<string> DoelGroepList = new List<string>();
        private static List<int> DoelGroepIndex = new List<int>();
        private static List<string> TaalList = new List<string>();
        private static List<int> TaalIndex = new List<int>();
        
        public System.Data.EntityState Modified { get; set; }
        public static ICollection<Meetinstrument> GetSetMeetinstrumentenLijst { get { return MeetinstrumentenLijst; } set { MeetinstrumentenLijst = value; } }
        public static int GetSetVoortgangBalk { get { return Meetinstrument.voortgangBalk; } set { Meetinstrument.voortgangBalk = value; } }
        public static int GetSetVraagNummer { get { return Meetinstrument.vraagNummer; } set { Meetinstrument.vraagNummer = value; } }
        public static List<string> GetSetLichaamsRegioList { get { return LichaamsRegioList; } set { LichaamsRegioList = value; } }
        public static List<string> GetSetAandoeningenList { get { return Meetinstrument.AandoeningenList; } set { Meetinstrument.AandoeningenList = value; } }
        public static List<string> GetSetFunctieList { get { return Meetinstrument.FunctieList; } set { Meetinstrument.FunctieList = value; } }
        public static List<string> GetSetDoelGroepList { get { return Meetinstrument.DoelGroepList; } set { Meetinstrument.DoelGroepList = value; } }
        public static List<string> GetSetTaalList { get { return Meetinstrument.TaalList; } set { Meetinstrument.TaalList = value; } }
        #endregion

        public enum DropDownlist
        {
            Lichaams_Regio,
            Aandoeningen,
            Functie,
            Taal,
            Doelgroep
        }

        public static Meetinstrument ReturnViews(int id)
        {
            DatabaseModelContainer db = new DatabaseModelContainer();
            return db.MeetinstrumentSet.Find(id);
        }

        public static Meetinstrument Create(Meetinstrument meetinstrument)
        {
            DatabaseModelContainer db = new DatabaseModelContainer();
                       
            List<LichaamsRegio> lich = new List<LichaamsRegio>();
            List<Aandoeningen> aand = new List<Aandoeningen>();
            List<Functies> func = new List<Functies>();
            List<Taal> taal = new List<Taal>();
            List<Doelgroep> doel = new List<Doelgroep>();

            for (int i = 0; i < LichaamsRegioIndex.Count; i++) lich.Add(db.LichaamsRegioSet.Find(Convert.ToInt32(LichaamsRegioIndex[i])));
            for (int i = 0; i < AandoeningenIndex.Count; i++) aand.Add(db.AandoeningenSet.Find(Convert.ToInt32(AandoeningenIndex[i])));
            for (int i = 0; i < FunctieIndex.Count; i++) func.Add(db.FunctiesSet.Find(Convert.ToInt32(FunctieIndex[i])));
            for (int i = 0; i < TaalIndex.Count; i++) taal.Add(db.TaalSet.Find(Convert.ToInt32(TaalIndex[i])));
            for (int i = 0; i < DoelGroepIndex.Count; i++) doel.Add(db.DoelgroepSet.Find(Convert.ToInt32(DoelGroepIndex[i])));

            for (int i = 0; i < lich.Count; i++) meetinstrument.LichaamsRegio.Add(lich[i]);
            for (int i = 0; i < aand.Count; i++) meetinstrument.Aandoeningen.Add(aand[i]);
            for (int i = 0; i < func.Count; i++) meetinstrument.Functies.Add(func[i]);
            for (int i = 0; i < taal.Count; i++) meetinstrument.Taal.Add(taal[i]);
            for (int i = 0; i < doel.Count; i++) meetinstrument.Doelgroep.Add(doel[i]);

            try
            {
                db.MeetinstrumentSet.Add(meetinstrument);
                db.SaveChanges();
            }
            catch (DbEntityValidationException dbEx)
            {
                foreach (var validationErrors in dbEx.EntityValidationErrors)
                {
                    foreach (var validationError in validationErrors.ValidationErrors)
                    {
                        Trace.TraceInformation("Property: {0} Error: {1}", validationError.PropertyName, validationError.ErrorMessage);
                    }
                }
            }
            meetinstrument.LichaamsRegio = null;
            meetinstrument.Aandoeningen = null;
            meetinstrument.Functies = null;
            meetinstrument.Taal = null;
            meetinstrument.Doelgroep = null;

            GetSetLichaamsRegioList = new List<string>();
            GetSetAandoeningenList = new List<string>();
            GetSetFunctieList = new List<string>();
            GetSetDoelGroepList = new List<string>();
            GetSetTaalList = new List<string>();

            LichaamsRegioIndex = new List<int>();
            AandoeningenIndex = new List<int>();
            FunctieIndex  = new List<int>();
            DoelGroepIndex = new List<int>();
            TaalIndex = new List<int>();
 
            return meetinstrument;
    }

        public static Meetinstrument Edit(Meetinstrument meetinstrument)
        {
            DatabaseModelContainer db = new DatabaseModelContainer();

            db.Entry(meetinstrument).State = EntityState.Modified;
            db.SaveChanges();

            return meetinstrument;
        }

        public static Meetinstrument Delete(int id)
        {
            DatabaseModelContainer db = new DatabaseModelContainer();

            Meetinstrument meetinstrument = db.MeetinstrumentSet.Find(id);

            ICollection<LichaamsRegio> LRList = meetinstrument.LichaamsRegio;
            ICollection<Aandoeningen> AAList = meetinstrument.Aandoeningen;
            ICollection<Functies> FUList = meetinstrument.Functies;
            ICollection<Doelgroep> DOList = meetinstrument.Doelgroep;
            ICollection<Taal> TAList = meetinstrument.Taal;

            for (int i = 0; i < LRList.Count; i++) { meetinstrument.LichaamsRegio.Remove(LRList.ElementAt(i)); }
            for (int i = 0; i < AAList.Count; i++) { meetinstrument.Aandoeningen.Remove(AAList.ElementAt(i)); }
            for (int i = 0; i < FUList.Count; i++) { meetinstrument.Functies.Remove(FUList.ElementAt(i)); }
            for (int i = 0; i < DOList.Count; i++) { meetinstrument.Doelgroep.Remove(DOList.ElementAt(i)); }
            for (int i = 0; i < TAList.Count; i++) { meetinstrument.Taal.Remove(TAList.ElementAt(i)); }


            db.MeetinstrumentSet.Remove(meetinstrument);
            db.SaveChanges();

            return meetinstrument;
        }

        public static List<SelectListItem> ReturnList(DropDownlist dropDownList)
        {
            switch (dropDownList)
            {
                case DropDownlist.Lichaams_Regio:
                    return MIZ.Models.LichaamsRegio.ReturnListCustomLichaamsregio();
                case DropDownlist.Aandoeningen:
                    return MIZ.Models.Aandoeningen.ReturnListCustomAandoeningen();
                case DropDownlist.Functie:
                    return MIZ.Models.Functies.ReturnListCustomFuncties();
                case DropDownlist.Taal:
                    return MIZ.Models.Taal.ReturnListCustomTaal();
                case DropDownlist.Doelgroep:
                    return MIZ.Models.Doelgroep.ReturnListCustomDoelGroep();
                default:
                    return null;
            }
        }

        public static void VoerKeuzesDoor(DropDownlist dropDownList, string keuze)
        {
            DatabaseModelContainer db = new DatabaseModelContainer();

            switch (dropDownList)
            {
                case DropDownlist.Lichaams_Regio:
                    GetSetMeetinstrumentenLijst = MIZ.Models.LichaamsRegio.VoerKeuzeLichaamsRegioDoor(keuze);
                    break;
                case DropDownlist.Aandoeningen:
                    GetSetMeetinstrumentenLijst = MIZ.Models.Aandoeningen.VoerKeuzeAandoeningDoor(keuze);
                    break;
                case DropDownlist.Functie:
                    GetSetMeetinstrumentenLijst = MIZ.Models.Functies.VoerKeuzeFunctieDoor(keuze);
                    break;
                case DropDownlist.Taal:
                    GetSetMeetinstrumentenLijst = MIZ.Models.Taal.VoerKeuzeTaalDoor(keuze);
                    break;
                case DropDownlist.Doelgroep:
                    GetSetMeetinstrumentenLijst = MIZ.Models.Doelgroep.VoerKeuzeDoelgroepDoor(keuze);
                    break;
                default:
                    break;
            }
        }

        public static void VeranderVraagNummer(DropDownlist dropDownList)
        {
            switch (dropDownList)
            {
                case DropDownlist.Lichaams_Regio:
                    GetSetVraagNummer = 1;
                    GetSetVoortgangBalk = 30;
                    break;
                case DropDownlist.Aandoeningen:
                    GetSetVraagNummer = 2;
                    GetSetVoortgangBalk = 60;
                    break;
                case DropDownlist.Functie:
                    GetSetVraagNummer = 3;
                    GetSetVoortgangBalk = 90;
                    break;
                case DropDownlist.Doelgroep:
                    GetSetVraagNummer = 4;
                    GetSetVoortgangBalk = 120;
                    break;
                case DropDownlist.Taal:
                    GetSetVraagNummer = 5;
                    GetSetVoortgangBalk = 150;
                    break;
                default:
                    GetSetVraagNummer = 1;
                    GetSetVoortgangBalk = 30;
                    break;
            }
        }

        public static Meetinstrument VoegDataToeAanLijsten(Meetinstrument meetinstrument, DropDownlist dropDownList, string keuze)
        {
            if (keuze == null || keuze == "")
            {
            }
            else
            {
                DatabaseModelContainer db = new DatabaseModelContainer();
                switch (dropDownList)
                {
                    case DropDownlist.Lichaams_Regio:
                        LichaamsRegioIndex.Add(Convert.ToInt32(keuze));
                        GetSetLichaamsRegioList.Add(db.LichaamsRegioSet.Find(Convert.ToInt32(keuze)).Lichaams_Regio.ToString());
                        break;
                    case DropDownlist.Aandoeningen:
                        AandoeningenIndex.Add(Convert.ToInt32(keuze));
                        GetSetAandoeningenList.Add(db.AandoeningenSet.Find(Convert.ToInt32(keuze)).Aandoening.ToString());
                        break;
                    case DropDownlist.Functie:
                        FunctieIndex.Add(Convert.ToInt32(keuze));
                        GetSetFunctieList.Add(db.FunctiesSet.Find(Convert.ToInt32(keuze)).Functie.ToString());
                        break;
                    case DropDownlist.Taal:
                        TaalIndex.Add(Convert.ToInt32(keuze));
                        GetSetTaalList.Add(db.TaalSet.Find(Convert.ToInt32(keuze)).Taal_meetinstrument.ToString());
                        break;
                    case DropDownlist.Doelgroep:
                        DoelGroepIndex.Add(Convert.ToInt32(keuze));
                        GetSetDoelGroepList.Add(db.DoelgroepSet.Find(Convert.ToInt32(keuze)).Doelgroep_meetinstrument.ToString());
                        break;
                    default:
                        break;
                }

                List<LichaamsRegio> lich = new List<LichaamsRegio>();
                for (int i = 0; i < LichaamsRegioIndex.Count; i++) lich.Add(db.LichaamsRegioSet.Find(Convert.ToInt32(LichaamsRegioIndex[i])));
                meetinstrument.LichaamsRegio = lich;

                List<Aandoeningen> aand = new List<Aandoeningen>();
                for (int i = 0; i < AandoeningenIndex.Count; i++) aand.Add(db.AandoeningenSet.Find(Convert.ToInt32(AandoeningenIndex[i])));
                meetinstrument.Aandoeningen = aand;

                List<Functies> func = new List<Functies>();
                for (int i = 0; i < FunctieIndex.Count; i++) func.Add(db.FunctiesSet.Find(Convert.ToInt32(FunctieIndex[i])));
                meetinstrument.Functies = func;

                List<Taal> taal = new List<Taal>();
                for (int i = 0; i < TaalIndex.Count; i++) taal.Add(db.TaalSet.Find(Convert.ToInt32(TaalIndex[i])));
                meetinstrument.Taal = taal;

                List<Doelgroep> doel = new List<Doelgroep>();
                for (int i = 0; i < DoelGroepIndex.Count; i++) doel.Add(db.DoelgroepSet.Find(Convert.ToInt32(DoelGroepIndex[i])));
                meetinstrument.Doelgroep = doel;
            }
            return meetinstrument;
        }

        public static ICollection<Meetinstrument> MaakNieuweLijstMeetinstrumentenOBVKeuze(ICollection<Meetinstrument> _OudMeetinstrumentenLijst, ICollection<Meetinstrument> _TempMeetinstrumentenLijst)
        {
            ICollection<Meetinstrument> _NewMeetinstrumentenLijst = new List<Meetinstrument>();
            bool _Aanwezig = false;

            for (int i = 0; i < _OudMeetinstrumentenLijst.Count; i++)
            {
                for (int j = 0; j < _TempMeetinstrumentenLijst.Count; j++)
                {
                    if (_OudMeetinstrumentenLijst.ElementAt(i).Id == _TempMeetinstrumentenLijst.ElementAt(j).Id)
                    {
                        _Aanwezig = true;
                    }
                }
                if (_Aanwezig)
                {
                    _NewMeetinstrumentenLijst.Add(_OudMeetinstrumentenLijst.ElementAt(i));
                    _Aanwezig = false;
                }
                else
                {
                    _Aanwezig = false;
                }
            }

            return _NewMeetinstrumentenLijst;
        }
    }
}